/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import pe.com.cotelasa.common.dao.DaoImpl;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Transactional;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.scp.dao.IDAOMovimientoCajaChica;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.CajaChica;
import pe.com.cotelasa.scp.entidad.MovimientoCajaChica;

/**
 *
 * @author DESARROLLO01
 */
@Repository("daoMovimientoCajaChica")
public class DAOMovimientoCajaChicaImpl extends DaoImpl<MovimientoCajaChica, Integer>
        implements IDAOMovimientoCajaChica, Serializable {

    @Override
    public Collection<MovimientoCajaChica> listarMovimientosCajaChica(MovimientoCajaChica movCajaChica) throws DAOException {

        List<MovimientoCajaChica> listaMovCajasChicas = new ArrayList<MovimientoCajaChica>();
        try {

            sessionFactory.getCurrentSession().flush();
            listaMovCajasChicas = sessionFactory.getCurrentSession().createCriteria(MovimientoCajaChica.class)
                    .add(Restrictions.eq("idCajaChica", movCajaChica.getIdCajaChica()))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor())).list();

        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaMovCajasChicas;

    }

    @Override
    @Transactional
    public Collection<MovimientoCajaChica> listarMovActivosCajaChica(CajaChica cajaChica) throws DAOException {


        List<MovimientoCajaChica> listaMovCajaChica = new ArrayList<MovimientoCajaChica>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaMovCajaChica = sessionFactory.getCurrentSession().createCriteria(MovimientoCajaChica.class)
                    .addOrder(Order.asc("id"))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idCajaChica", cajaChica))
                    .list();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaMovCajaChica;

    }

    @Override
    public Collection<MovimientoCajaChica> listarMovimientoPorFiltro(MovimientoCajaChica movCajaChica, Date fechaInicio, Date fechaFinal) throws DAOException {
        List<MovimientoCajaChica> listaMovCajaChica = new ArrayList<MovimientoCajaChica>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(MovimientoCajaChica.class)
                    .addOrder(Order.asc("fechaSolicitud"))
                    .createAlias("idCajaChica", "ca")
                    .createAlias("ca.idSede", "se")
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("tipoMovimiento", movCajaChica.getTipoMovimiento()));
            if (movCajaChica.getIdCajaChica().getIdSede().getId() != null) {
                query = query.add(Restrictions.eq("se.id", movCajaChica.getIdCajaChica().getIdSede().getId()));
            } else {
                query = query.add(Restrictions.eq("se.idEmpresa", movCajaChica.getIdCajaChica().getIdSede().getIdEmpresa()));
            }
            if (movCajaChica.getMotivo() != null) {
                query = query.add(Restrictions.like("motivo", "%"+movCajaChica.getMotivo()+"%"));
            }

            if (fechaInicio == null && fechaFinal == null) {
                listaMovCajaChica = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                listaMovCajaChica = query.add(Restrictions.ge("fechaSolicitud", fechaInicio)).add(Restrictions.le("fechaSolicitud", fechaFinal)).list();
            } else if (fechaInicio == null) {
                listaMovCajaChica = query.add(Restrictions.le("fechaSolicitud", fechaFinal)).list();
            } else if (fechaFinal == null) {
                listaMovCajaChica = query.add(Restrictions.ge("fechaSolicitud", fechaInicio)).list();
            }

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaMovCajaChica;
    }
}
